From a1f732504e2c65836b08c9129902b3315f59b294 Mon Sep 17 00:00:00 2001 From: "ach61@labyrinth.cl.cam.ac.uk" Date: Tue, 20 May 2003 17:49:11 +0000 Subject: [PATCH] bitkeeper revision 1.246 (3eca6a979guOx5GLVimvVvJLI_a1Ag) additional error checking and input validation --- .rootkeys | 1 + tools/control/README-xenctl | 45 ++++++++++++ .../src/uk/ac/cam/cl/xeno/xenctl/Library.java | 17 ++++- .../uk/ac/cam/cl/xeno/xenctl/RootBean.java | 24 +++++- tools/control/web/tmpl/dom-delr.tmpl | 11 ++- tools/control/web/tmpl/dom-star.tmpl | 15 +++- tools/control/web/tmpl/dom-stpr.tmpl | 11 ++- tools/control/web/tmpl/vd-par.tmpl | 32 +++++--- tools/control/web/tmpl/vd-vbdcr.tmpl | 67 +++++++++++++---- tools/control/web/tmpl/vd-vdcr.tmpl | 73 +++++++++++++------ tools/control/web/tmpl/vd-vdrr.tmpl | 55 +++++++------- 11 files changed, 268 insertions(+), 83 deletions(-) create mode 100644 tools/control/README-xenctl diff --git a/.rootkeys b/.rootkeys index de42d5d437..351d4920af 100644 --- a/.rootkeys +++ b/.rootkeys @@ -7,6 +7,7 @@ 3e6377d6eiFjF1hHIS6JEIOFk62xSA tools/balloon/README 3e6377dbGcgnisKw16DPCaND7oGO3Q tools/balloon/balloon.c 3eb781edFwm_pW9FwnQACIe68viLOw tools/control/Makefile +3eca6a96a31IwaKtkEa4jmzwTWlm8Q tools/control/README-xenctl 3eb781fcTp_LPQwaot3SSSehkaf4eg tools/control/build-dom.xml 3ec41f7cWCxQ8pdH8ZWqhhv-38qQ1w tools/control/build-xen.xml 3ec41f7ca6IBXDSe0HVcMPp3PPloOQ tools/control/build.properties diff --git a/tools/control/README-xenctl b/tools/control/README-xenctl new file mode 100644 index 0000000000..379ef28e71 --- /dev/null +++ b/tools/control/README-xenctl @@ -0,0 +1,45 @@ + +some notes on configuring xenctl... + +to build: + + # edit xeno.bk/tools/control/build.properties + # change manger.url to your xenoserver: mousetrap-0.xeno.cl.cam.ac.uk + # change build.home to your xeno.bk path + export PATH=/usr/groups/xeno/build_tools/bin:${PATH} + # this next step has already been done. + # cp $CATALINA_HOME/server/lib/catalina-ant.jar $ANT_HOME/lib + cd xeno.bk/tools/control + make + cd xeno.bk/tools/internal + make + +to setup: + + ## expand the jakarta (aka catalina) tree somewhere accessible by dom0 + export ROOTDIR=/anfs/scratch/labyrinth/ach61 + cd $ROOTDIR + tar zxf /usr/groups/xeno/archive/tomcat-4.1.24.tar.gz + export CATALINA_HOME=$ROOTDIR/jakarta-tomcat-4.1.24 + export JAVA_HOME=/usr/groups/xeno/build_tools/java-1.4.1 + + ## edit $CATALINA_HOME/conf/server.xml, change port 8080 to port 80 + cp $CATALINA_HOME/conf/server.xml $CATALINA_HOME/conf/server.orig + sed 's/8080/80/g' $CATALINA_HOME/conf/server.orig > $CATALINA_HOME/conf/server.xml + + ## install the xenctl web archive + cp xeno.bk/tools/control/dist/xenctl-0.1-dev.war $CATALINA_HOME/webapps/xenctl.war + cp xeno.bk/tools/control/domctl.xml /var/lib/xen + + ## either edit xi_tools_dir in domctl.xml or copy the binaries + # find xeno.bk/tools/internal -perm +111 -type f -exec cp {} /usr/local/bin \; + +to run: + $CATALINA_HOME/bin/startup.sh + # point your browser at hostname-0.xeno.cl.cam.ac.uk:80/xenctl + + +for development: + ## to "make install" in xeno.bk/tools/control instead of copying the war file + cp $CATALINA_HOME/conf/tomcat-users.xml $CATALINA_HOME/conf/tomcat-users.orig + sed -e 's//\ \ \ /' $CATALINA_HOME/conf/tomcat-users.orig > $CATALINA_HOME/conf/tomcat-users.xml diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java index 0679ccaedd..27748b5f48 100644 --- a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/Library.java @@ -64,6 +64,12 @@ Library { String substring = size; int suffix = 1; + long value = 0; + + if (size == null) + { + return 0; + } if ((substring = check(size, 'm')) != null) { @@ -94,7 +100,16 @@ Library substring = size; } - return Long.decode(substring).longValue() * suffix; + try + { + value = Long.decode(substring).longValue() * suffix; + } + catch (NumberFormatException e) + { + value = 0; + } + + return value; } static String diff --git a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java index 08f388dccb..668f922129 100644 --- a/tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java +++ b/tools/control/src/uk/ac/cam/cl/xeno/xenctl/RootBean.java @@ -71,14 +71,19 @@ RootBean Partition p = pm.get_partition(partition); String result="done"; int loop; + long size; if (p == null) { return (" eh? what partition: " + partition); } - vdm.add_xeno_partition(p, - Library.parse_size(chunksize)/default_sector_size); + size = Library.parse_size(chunksize) / default_sector_size; + if (size == 0) + { + return ("error: invalid chunk size"); + } + vdm.add_xeno_partition(p, size); pm.add_xeno_partition(p); /* return pm.dump(true); */ @@ -110,9 +115,15 @@ RootBean { VirtualDisk vd; Date date = new Date(); + long parse_size; - vd = vdm.create_virtual_disk(name, - Library.parse_size(size)/default_sector_size, + + parse_size = Library.parse_size(size)/default_sector_size; + if (parse_size == 0) + { + return ("error: invalid size"); + } + vd = vdm.create_virtual_disk(name, parse_size, new Date(date.getTime() + expiry)); return ("Virtual Disk created with key: " + vd.get_key()); @@ -122,6 +133,11 @@ RootBean public String doDeleteVirtualDisk (String key) { + if (key == null || + key.trim().equals("")) + { + return ("error: no virtual disk specified"); + } vdm.delete_virtual_disk(key); return ("okay"); diff --git a/tools/control/web/tmpl/dom-delr.tmpl b/tools/control/web/tmpl/dom-delr.tmpl index 0693570f7a..04218eb72b 100644 --- a/tools/control/web/tmpl/dom-delr.tmpl +++ b/tools/control/web/tmpl/dom-delr.tmpl @@ -22,13 +22,22 @@ INCLUDE&dommenu.tmpl String domains[] = hsrw.getParameterValues("dom"); boolean force = hsrw.getParameter("force").equals("true"); - for (int i = 0; i < domains.length; i++) + if (domains == null || domains.length == 0) { %> +Error: no domain specified.
+<% + } + else + { + for (int i = 0; i < domains.length; i++) + { +%> result <%= domains[i] %> = <%= command_destroy.executeCommand(d, Integer.parseInt(domains[i]), force) %>
<% + } } %> diff --git a/tools/control/web/tmpl/dom-star.tmpl b/tools/control/web/tmpl/dom-star.tmpl index cd7e27abd4..2c3b56ef3d 100644 --- a/tools/control/web/tmpl/dom-star.tmpl +++ b/tools/control/web/tmpl/dom-star.tmpl @@ -21,13 +21,22 @@ INCLUDE&dommenu.tmpl String domains[] = hsrw.getParameterValues("dom"); - for (int i = 0; i < domains.length; i++) + if (domains == null || domains.length == 0) { %> -result <%= domains[i] %> = - <%= command_start.executeCommand(d, Integer.parseInt(domains[i])) %>
+Error: no domain specified.
<% } + else + { + for (int i = 0; i < domains.length; i++) + { +%> +result <%= domains[i] %> =
+<%= command_start.executeCommand(d, Integer.parseInt(domains[i])) %>
+<% + } + } %> diff --git a/tools/control/web/tmpl/dom-stpr.tmpl b/tools/control/web/tmpl/dom-stpr.tmpl index 8c0016e89b..a2eb6b23a6 100644 --- a/tools/control/web/tmpl/dom-stpr.tmpl +++ b/tools/control/web/tmpl/dom-stpr.tmpl @@ -21,12 +21,21 @@ INCLUDE&dommenu.tmpl String domains[] = hsrw.getParameterValues("dom"); - for (int i = 0; i < domains.length; i++) + if (domains == null || domains.length == 0) { %> +Error: no domain specified.
+<% + } + else + { + for (int i = 0; i < domains.length; i++) + { +%> result <%= domains[i] %> = <%= command_stop.executeCommand(d, Integer.parseInt(domains[i])) %>
<% + } } %> diff --git a/tools/control/web/tmpl/vd-par.tmpl b/tools/control/web/tmpl/vd-par.tmpl index 3a7f5ec3b9..b72e99b814 100644 --- a/tools/control/web/tmpl/vd-par.tmpl +++ b/tools/control/web/tmpl/vd-par.tmpl @@ -17,22 +17,34 @@ INCLUDE&vdmenu.tmpl HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request); String partitions[] = hsrw.getParameterValues("p"); - String size = hsrw.getParameter("chunk").trim() + - hsrw.getParameter("chunkunits").trim(); + String size = null; - for (int i = 0; i < partitions.length; i++) + if (partitions == null || partitions.length == 0) { %> -p = <%= root.doAddPartition(partitions[i], size) %>
+Error: No partitions chosen.
<% } + else if (hsrw.getParameter("chunk") == null || + hsrw.getParameter("chunk").trim().equals("")) + { +%> +Error: chunk size not specified.
+<% + } + else + { + size = hsrw.getParameter("chunk").trim() + + hsrw.getParameter("chunkunits").trim(); + for (int i = 0; i < partitions.length; i++) + { +%> +output[<%= i %>] =
+<%= root.doAddPartition(partitions[i], size) %>
+<% + } + } %> -chunk = <%= hsrw.getParameter("chunk") %> -
-chunkunits = <%= hsrw.getParameter("chunkunits") %> -
-size = <%= size %> -
<% diff --git a/tools/control/web/tmpl/vd-vbdcr.tmpl b/tools/control/web/tmpl/vd-vbdcr.tmpl index 78d1d74c6e..656be575fc 100644 --- a/tools/control/web/tmpl/vd-vbdcr.tmpl +++ b/tools/control/web/tmpl/vd-vbdcr.tmpl @@ -15,20 +15,61 @@ INCLUDE&vdmenu.tmpl <% HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request); + + if (hsrw.getParameter("vd") == null || + hsrw.getParameter("vd").trim().equals("")) + { +%> +Error: No virtual disk chosen.
+<% + } + else if (hsrw.getParameter("domain") == null || + hsrw.getParameter("domain").trim().equals("")) + { +%> +Error: No domain specified.
+<% + } + else if (hsrw.getParameter("vbd") == null || + hsrw.getParameter("vbd").trim().equals("")) + { +%> +Error: No virtual block device number specified.
+<% + } + else + { + int domain = -1; + int vbd = -1; + + try + { + domain = Integer.decode(hsrw.getParameter("domain")).intValue(); + vbd = Integer.decode(hsrw.getParameter("vbd")).intValue(); +%> +output =
+<%= root.doCreateVirtualBlockDevice(hsrw.getParameter("vd"), + domain, vbd, + hsrw.getParameter("mode")) %> +<% + } + catch (NumberFormatException e) + { + if (domain == -1) + { +%> +Error: invalid domain specification.
+<% + } + else + { +%> +Error: invalid virtual block device number specification.
+<% + } + } + } %> -output = <%= root.doCreateVirtualBlockDevice(hsrw.getParameter("vd"), - Integer.decode(hsrw.getParameter("domain")).intValue(), - Integer.decode(hsrw.getParameter("vbd")).intValue(), - hsrw.getParameter("mode")) - %> -
-vd = <%= hsrw.getParameter("vd") %> -
-domain = <%= hsrw.getParameter("domain") %> -
-vbd = <%= hsrw.getParameter("vbd") %> -
-mode = <%= hsrw.getParameter("mode") %> <% root.doFlushState(); diff --git a/tools/control/web/tmpl/vd-vdcr.tmpl b/tools/control/web/tmpl/vd-vdcr.tmpl index 85936cdd95..08e63b2e90 100644 --- a/tools/control/web/tmpl/vd-vdcr.tmpl +++ b/tools/control/web/tmpl/vd-vdcr.tmpl @@ -16,39 +16,64 @@ INCLUDE&vdmenu.tmpl <% HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request); - String size = hsrw.getParameter("size").trim() + - hsrw.getParameter("sizeunits").trim(); - long expiry = Long.decode(hsrw.getParameter("expiry")).longValue(); + String size = null; + String expiry_string = null; + long expiry = 0; - /* not perfect, but good enough for now... */ - if ( hsrw.getParameter("expiryunits").equals("d")) + if (hsrw.getParameter("size") == null || + hsrw.getParameter("size").trim().equals("")) { - expiry *= 24 * 60 * 60 * 1000; - } - else if ( hsrw.getParameter("expiryunits").equals("w")) - { - expiry *= 24 * 60 * 60 * 1000 * 7; +%> +Error: size not specified.
+<% } - else if ( hsrw.getParameter("expiryunits").equals("m")) + else if (hsrw.getParameter("expiry") == null || + hsrw.getParameter("expiry").trim().equals("")) { - expiry *= 24 * 60 * 60 * 1000 * 30; +%> +Error: expiry time not specified.
+<% } - else if ( hsrw.getParameter("expiryunits").equals("y")) + else { - expiry *= 24 * 60 * 60 * 1000 * 365; - } + size = hsrw.getParameter("size").trim() + + hsrw.getParameter("sizeunits").trim(); + + try + { + expiry = Long.decode(hsrw.getParameter("expiry")).longValue(); + /* not perfect, but good enough for now... */ + if ( hsrw.getParameter("expiryunits").equals("d")) + { + expiry *= 24 * 60 * 60 * 1000; + } + else if ( hsrw.getParameter("expiryunits").equals("w")) + { + expiry *= 24 * 60 * 60 * 1000 * 7; + } + else if ( hsrw.getParameter("expiryunits").equals("m")) + { + expiry *= 24 * 60 * 60 * 1000 * 30; + } + else if ( hsrw.getParameter("expiryunits").equals("y")) + { + expiry *= 24 * 60 * 60 * 1000 * 365; + } %> -output = <%= root.doCreateVirtualDisk( hsrw.getParameter("name"), - size, expiry) - %> -
-size = <%= size %> -
-expiry = <%= hsrw.getParameter("expiry") %> -
-expiryunits = <%= hsrw.getParameter("expiryunits") %> +output =
+<%= root.doCreateVirtualDisk( hsrw.getParameter("name"), size, expiry) %>
+<% + } + catch (NumberFormatException e) + { +%> +Error: invalid expiry time specification.
+<% + } + } +%> <% root.doFlushState(); diff --git a/tools/control/web/tmpl/vd-vdrr.tmpl b/tools/control/web/tmpl/vd-vdrr.tmpl index bf93429b26..068b283056 100644 --- a/tools/control/web/tmpl/vd-vdrr.tmpl +++ b/tools/control/web/tmpl/vd-vdrr.tmpl @@ -1,4 +1,4 @@ -Refresh Virtual Disk Results +Refresh Virtual Disk SECTION&XenoServers BREADCRUMB&Virtual Disk Manager&vd.jsp @@ -14,34 +14,43 @@ INCLUDE&vdmenu.tmpl HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper(request); String vds[] = hsrw.getParameterValues("vd"); - long expiry = Long.decode(hsrw.getParameter("expiry")).longValue(); + long expiry; - /* not perfect, but good enough for now... */ - if ( hsrw.getParameter("expiryunits").equals("d")) - { - expiry *= 24 * 60 * 60 * 1000; - } - else if ( hsrw.getParameter("expiryunits").equals("w")) + if (vds == null || vds.length == 0) { - expiry *= 24 * 60 * 60 * 1000 * 7; - } - else if ( hsrw.getParameter("expiryunits").equals("m")) - { - expiry *= 24 * 60 * 60 * 1000 * 30; +%> +Error: No virtual disk chosen.
+<% } - else if ( hsrw.getParameter("expiryunits").equals("y")) + else if (hsrw.getParameter("expiry") == null || + hsrw.getParameter("expiry").trim().equals("")) { - expiry *= 24 * 60 * 60 * 1000 * 365; - } - - if (vds == null) - { %> -no virtual disks selected. +Error: expiry time not specified.
<% } else { + expiry = Long.decode(hsrw.getParameter("expiry")).longValue(); + + /* not perfect, but good enough for now... */ + if ( hsrw.getParameter("expiryunits").equals("d")) + { + expiry *= 24 * 60 * 60 * 1000; + } + else if ( hsrw.getParameter("expiryunits").equals("w")) + { + expiry *= 24 * 60 * 60 * 1000 * 7; + } + else if ( hsrw.getParameter("expiryunits").equals("m")) + { + expiry *= 24 * 60 * 60 * 1000 * 30; + } + else if ( hsrw.getParameter("expiryunits").equals("y")) + { + expiry *= 24 * 60 * 60 * 1000 * 365; + } + for (int i = 0; i < vds.length; i++) { %> @@ -51,12 +60,6 @@ vd = <%= root.doRefreshVirtualDisk(vds[i], expiry) %>
} %> -
-expiry = <%= hsrw.getParameter("expiry") %> -
-expiryunits = <%= hsrw.getParameter("expiryunits") %> -
- <% root.doFlushState(); %> -- 2.30.2